package com.hmall.common.utils;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.collection.IterUtil;
import cn.hutool.core.util.NumberUtil;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 集合工具类
 * 继承自Hutool的CollectionUtil，扩展了空集合处理和类型转换功能
 */
public class CollUtils extends CollectionUtil {

    /**
     * 获取空List（不可变）
     * @param <T> 元素类型
     * @return 空List实例
     */
    public static <T> List<T> emptyList() {
        return Collections.emptyList();
    }

    /**
     * 获取空Set（不可变）
     * @param <T> 元素类型
     * @return 空Set实例
     */
    public static <T> Set<T> emptySet() {
        return Collections.emptySet();
    }

    /**
     * 获取空Map（不可变）
     * @param <K> 键类型
     * @param <V> 值类型
     * @return 空Map实例
     */
    public static <K, V> Map<K, V> emptyMap() {
        return Collections.emptyMap();
    }

    /**
     * 获取单元素Set
     * @param <T> 元素类型
     * @param t 元素值
     * @return 包含单个元素的Set
     */
    public static <T> Set<T> singletonSet(T t) {
        return Collections.singleton(t);
    }

    /**
     * 获取单元素List
     * @param <T> 元素类型
     * @param t 元素值
     * @return 包含单个元素的List
     */
    public static <T> List<T> singletonList(T t) {
        return Collections.singletonList(t);
    }

    /**
     * 将字符串列表转换为Integer列表
     * @param originList 源字符串列表
     * @return 转换后的Integer列表（空列表返回null）
     */
    public static List<Integer> convertToInteger(List<String> originList) {
        return isNotEmpty(originList) ?
                originList.stream().map(NumberUtil::parseInt).collect(Collectors.toList()) :
                null;
    }

    /**
     * 将字符串列表转换为Long列表
     * @param originList 源字符串列表
     * @return 转换后的Long列表（空列表返回null）
     */
    public static List<Long> convertToLong(List<String> originList) {
        return isNotEmpty(originList) ?
                originList.stream().map(NumberUtil::parseLong).collect(Collectors.toList()) :
                null;
    }

    /**
     * 使用分隔符连接集合元素为字符串
     * @param collection 待连接的集合
     * @param conjunction 分隔符
     * @param <T> 元素类型
     * @return 连接后的字符串（集合为空返回null）
     */
    public static <T> String join(Collection<T> collection, CharSequence conjunction) {
        if (null == collection || collection.isEmpty()) {
            return null;
        }
        return IterUtil.join(collection.iterator(), conjunction);
    }

    /**
     * 使用分隔符连接集合元素为字符串（忽略null元素）
     * @param collection 待连接的集合
     * @param conjunction 分隔符（实际使用逗号，方法名保留参数兼容）
     * @return 连接后的字符串（无有效元素返回null）
     */
    public static <T> String joinIgnoreNull(Collection<T> collection, CharSequence conjunction) {
        if (null == collection || collection.isEmpty()) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for (T t : collection) {
            if (t == null) continue;
            sb.append(t).append(",");
        }
        if (sb.length() <= 0) {
            return null;
        }
        return sb.deleteCharAt(sb.length() - 1).toString();
    }
}